home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
vbrdobtn
/
vbrdobtn.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-21
|
24KB
|
722 lines
#include "windows.h"
#include "vbapi.h"
/********************************************************************************************************************************
Custom 3-D buttons for Visual Basic by Mark Gamber, March 1992
This code may be freely distributed and modified. Because of this, it is not supported by the author.
********************************************************************************************************************************/
LONG FAR PASCAL _export MainWndProc( HCTL, HWND, WORD, WORD, LONG ); /* Function prototypes */
void PaintControl( HCTL, HWND );
void AutoCheck( HCTL, HWND );
BOOL _export FAR PASCAL SetColor( HWND, WORD, WORD, LONG );
LONG _export FAR PASCAL PopupWndProc( HWND, WORD, WORD, LONG );
typedef struct { /* Structure passed by hCtl */
long Color;
long CheckBorderColor;
long ShadowColor;
int Shadow;
int Xsize, Ysize;
int Selected;
int ButtonDown;
HFONT hFont;
char Caption[ 129 ];
} BTNSTRUCT;
#define DEREF(hctl) ((BTNSTRUCT far *)VBDerefControl(hctl)) /* Method to access above structure using hCtl */
/******************************************* Control Properties **************************************************/
char ValueList[] = "0 - Unchecked\0"\
"1 - Checked\0"\
"";
char *CLASSPOPUP = "CPopup";
PROPINFO piValue =
{
"Value",
DT_ENUM | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
0, 0, 0, ValueList, 1
};
PROPINFO piCheckColor =
{
"CheckColor",
DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData | PF_fEditable,
0, 0, NULL, 0
};
PROPINFO piCheckBorderColor =
{
"ChkBrdColor",
DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData | PF_fEditable,
0, 0, NULL, 0
};
PROPINFO piShadow =
{
"TextShadow",
DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
0, 0, NULL, 0
};
PROPINFO piShadowColor =
{
"TextShadowCol",
DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
0, 0, NULL, 0
};
PROPINFO piVersion =
{
"Version",
DT_SHORT | PF_fGetMsg,
0, 0, NULL, 0
};
PPROPINFO proplistBtn[] = /* Properties supported by this control module */
{ /* Note: Does not have to be in a particular order */
PPROPINFO_STD_CTLNAME,
PPROPINFO_STD_CAPTION,
PPROPINFO_STD_BACKCOLOR,
PPROPINFO_STD_FORECOLOR,
PPROPINFO_STD_LEFT,
PPROPINFO_STD_TOP,
PPROPINFO_STD_HEIGHT,
PPROPINFO_STD_WIDTH,
PPROPINFO_STD_INDEX,
PPROPINFO_STD_FONTNAME,
PPROPINFO_STD_FONTBOLD,
PPROPINFO_STD_FONTITALIC,
PPROPINFO_STD_FONTSTRIKE,
PPROPINFO_STD_FONTUNDER,
PPROPINFO_STD_FONTSIZE,
PPROPINFO_STD_ENABLED,
PPROPINFO_STD_MOUSEPOINTER,
PPROPINFO_STD_TABINDEX,
PPROPINFO_STD_TABSTOP,
PPROPINFO_STD_DRAGICON,
PPROPINFO_STD_DRAGMODE,
&piValue,
&piCheckColor,
&piCheckBorderColor,
&piShadow,
&piShadowColor,
&piVersion,
NULL,
};
#define PROP_BASE 21 /* Definitions for easier property management */
#define PROP_VALUE PROP_BASE
#define PROP_COLOR (PROP_BASE+1)
#define PROP_CHKBRDCOLOR (PROP_BASE+2)
#define PROP_SHADOW (PROP_BASE+3)
#define PROP_SHADOWCOLOR (PROP_BASE+4)
#define PROP_VERSION (PROP_BASE+5)
/*********************************************** Control Events **************************************************/
EVENTINFO peClick = /* Description of "Click" event */
{
"Click",
0, 0, NULL, NULL
};
PEVENTINFO eventlistBtn[] = /* List of events supported by this control */
{ /* Note: This MUST be in alphabetical order */
&peClick,
PEVENTINFO_STD_DBLCLICK,
PEVENTINFO_STD_GOTFOCUS,
PEVENTINFO_STD_KEYDOWN,
PEVENTINFO_STD_KEYPRESS,
PEVENTINFO_STD_KEYUP,
PEVENTINFO_STD_LOSTFOCUS,
NULL
};
#define EVENT_CLICK 0
char CONTROLNAME[] = "Radio3D";
MODEL modelBtn = /* Model for custom checkbox control */
{ /* This is similar to registering a class in Windows */
VB_VERSION,
MODEL_fFocusOk | MODEL_fMnemonic, /* Ok to accept focus from form */
(PCTLPROC)MainWndProc,
NULL,
WS_CHILD | BS_OWNERDRAW, /* Ownerdraw button */
sizeof(BTNSTRUCT), /* Size of user-defined structure from above */
8000, /* Number of first bitmap used in toolbox */
CONTROLNAME,
CONTROLNAME, /* Control name */
"button", /* Subclassing a Windows "button" control */
proplistBtn,
eventlistBtn /* Include property and event support lists */
};
/********************************************* Standard VB DLL Code sections *************************************************/
HANDLE hmodDLL;
HCTL ColorHctl;
HWND ColorHwnd;
WORD ColorID;
BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize ) /* Called when Windows loads the DLL */
{
hmodDLL = hmod; /* Save data selector in global variable */
UnlockData( 0 ); /* Unlock the default data segment (Make it moveable) */
return( TRUE );
}
BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime ) /* Called when VB loads the control */
{
if( ! fRunTime )
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)PopupWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hmodDLL;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASSPOPUP;
if( ! RegisterClass( &wc ) )
return( FALSE );
}
return( VBRegisterModel( hmodDLL, &modelBtn ) ); /* Just register the button(s) */
}
/********************************************** Window control procedure *****************************************************/
/* Button control routine */
LONG FAR PASCAL _export MainWndProc( HCTL hCtl, HWND hWnd, WORD msg, WORD wParam, LONG lParam )
{
switch( msg )
{
case VBN_DRAWITEM: /* Control needs repainted...same as WM_DRAWITEM */
{
LPDRAWITEMSTRUCT lpDs = (LPDRAWITEMSTRUCT)lParam;
BTNSTRUCT far *Bs = DEREF( hCtl );
TEXTMETRIC tm;
RECT Rect;
if( lpDs->itemAction & ODA_FOCUS )
{
if( Bs->hFont )
SelectObject( lpDs->hDC, Bs->hFont );
GetTextMetrics( lpDs->hDC, &tm );
Rect.top = 0;
Rect.left = 16;
Rect.right = Bs->Xsize - 1;
Rect.bottom = Bs->Ysize - 1;
DrawFocusRect( lpDs->hDC, &Rect );
return